/** 
 *  @file       IIC.c
 *  @brief      IIC通讯协议
 *  @author     Z B T  
 *  @version    
 *  @date       2016-01 
 */

/* Includes ------------------------------------------------------------------*/
#include "iic.h"
#include "delay.h"

/* GPIO ------------------------------------------------------------------*/
sbit IIC_SCL = P2^1;
sbit IIC_SDA = P2^2;

/* Private variables ---------------------------------------------------------*/


/* Private function prototypes ------------------------------------------------*/
static void IIC_delay_10us(void);

/* Public functions ---------------------------------------------------------*/

/**
 *  @brief  在IIC_SCL时钟信号高电平期间IIC_SDA产生一个下降沿
 *  @param  None
 *  @return None
 */
void IIC_start(void)
{
    IIC_SDA = 1;            /**< 都为高电平 总线处于空闲状态 */
    IIC_SCL = 1;
	IIC_delay_10us();		/**< IIC_SDA保持4.7us以上 */
	IIC_delay_10us();
	IIC_SDA = 0;
	IIC_delay_10us();		/**< 保持时间大于4us */
	IIC_SCL = 0;
	IIC_delay_10us();
}

/**
 *  @brief  在IIC_SCL时钟信号高电平期间IIC_SDA产生一个上升沿
 *	@brief	之后IIC_SDA IIC_SCL均为高电平 表示总线空闲 
 *  @param  None
 *  @return None
 */
void IIC_stop(void)
{
	IIC_SDA = 0;
	IIC_delay_10us();
	IIC_SCL = 1;
	IIC_delay_10us();		/**< IIC_SDA保持4.7us以上 */
	IIC_SDA = 1;
	IIC_delay_10us();
}

 /**
 *  @brief  IIC发送一个字节
 *  @param  dat  要发送的字节  ack 应答标志
 *  @return 0 发送失败		1 发送成功
 */
unsigned char IIC_send_byte(unsigned char dat, unsigned char ack)
{
	unsigned char i = 0;
	unsigned char j = 0;

	for (i = 0; i < 8; i++)		/**< 发送8位数据 从最高位开始发送 */
	{
		IIC_SDA = dat >> 7;		/**< IIC_start();之后 IIC_SCL = 0; 可直接改变IIC_SDA的值 */
		IIC_delay_10us();
		IIC_SCL = 1;
		IIC_delay_10us();		/**< IIC_SDA保持4.7us以上 */
		IIC_SCL = 0;
		IIC_delay_10us();		/**< 保持时间大于4us */
        dat <<= 1;              /**< 待发送数据左移 准备发送下一位 */
	}

	IIC_SDA = 1;
	IIC_delay_10us();
	IIC_SCL = 1;
	while (IIC_SDA && (ack == 1))	/** 等待应答 */
	{
		j++;
		if (j > 200)				/**< 超时判断 非应答/接收结束 */
		{
			IIC_SCL = 0;
			IIC_delay_10us();
			return 0;
		}
	}

	IIC_SCL = 0;
	IIC_delay_10us();
	return 1;						/**< 应答成功 */
}

 /**
 *  @brief  IIC读取一个字节
 *  @param  None
 *  @return dat 读取到的字节
 */
unsigned char IIC_read_byte(void)
{
	unsigned char i = 0;
	unsigned char dat = 0;

	IIC_SDA = 1;				/**< 起始和发送一个字节后IIC_SCL = 0; */
	IIC_delay_10us();
	for (i = 0; i < 8; i++)		/**< 逐次接收8个字节 */
	{
		IIC_SCL = 1;
		IIC_delay_10us();
		dat = (dat << 1) | IIC_SDA;
		IIC_delay_10us();
		IIC_SCL = 0;
		IIC_delay_10us();
	}

	return dat;
}

/* Private function prototypes ------------------------------------------------*/
 /**
 *  @brief  延时10us
 *  @param  None
 *  @return None
 */
static void IIC_delay_10us(void)
{
	unsigned char i, j;

	for (i = 1; i > 0; i--)
	{
		for (j = 2; j > 0; j--);
	}
}

 /**
 *  @brief  ds18b20初始化函数
 *  @param  None
 *  @return None
 */